package ScalaStudy.chapter05

object Test09_ClosureAndCurrying {

  def main(args: Array[String]): Unit = {


    /////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////   闭包   ///////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////


    def add(a: Int, b: Int): Int = {
      a + b
    }

    //（1）考虑固定一个加数的场景
    def addByFour(b: Int): Int = {
      4 + b
    }

    //（2）将固定加数作为第一层加数传入
    //闭包
    def addByFour1():Int => Int = {
      val a = 4
      def addB(b: Int): Int = {
        a + b
      }
      addB
    }

    //（3）闭包优化
println("(3)")

    def addByA(a :Int):Int => Int = {
      def addB(b: Int): Int = {
        a + b
      }
      addB
    }
    println(addByA(3)(5))

    //一层一层剥开你的心
    val addByFour2 = addByA(3)
    println(addByFour2(5))

    //（4）lambda表达式简写
print("(4)")

    def addBya1(a :Int):Int => Int = a + _

    val addBya_ = addBya1(3)
    println(addBya_(5))


    /////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////   柯里化   //////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////

//柯里化
    //柯大侠
println("(5)")

    def add_(a: Int)(b: Int): Int = {
      a + b
    }
    println(add_(3)(5))







    
  }
}

